package toolsKit.csv;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class CsvFile05 extends AbstractAdvanceCsvFile {

	protected boolean autoDetectSeparatorMode = false;
	private int numberOfLinesForAutoDetectSeparator = 5;

	protected CsvFile05() {
		super();
	}

	public CsvFile05(File file) {
		this(file, DEFAULT_SEPARATOR);
	}

	public CsvFile05(File file, char separator) {
		this(file, separator, false);
	}

	public CsvFile05(File file, char separator, boolean autoDetectSeparatorMode) {
		this();

		if (file == null) {
			throw new IllegalArgumentException("Le fichier file ne peut pas �tre null");
		}

		this.file = file;

		if (!autoDetectSeparatorMode) {
			if (!isValidSeparator(separator)) {
				throw new IllegalArgumentException("Le s�parateur sp�cifi� n'est pas pris en charge.");
			}
			this.separator = separator;
		}

		this.autoDetectSeparatorMode = autoDetectSeparatorMode;

		// Init
		init();
	}

	public Character selectBestSeparator() {

		if (cleanedLines.size() == 0) {
			// Exception ?...
		}

		// Ajustement du nombre de lignes dispo
		if (cleanedLines.size() < numberOfLinesForAutoDetectSeparator) {
			numberOfLinesForAutoDetectSeparator = cleanedLines.size();
		}

		List<Character> reste = new ArrayList<Character>();

		for (Character separator : AVAILABLE_SEPARATORS) {
			int previous = 0;
			boolean isGoodCandidate = false;
			for (int i = 0; i < numberOfLinesForAutoDetectSeparator; i++) {
				int compte = compterSeperateurs(cleanedLines.get(i), separator);
				if (compte == 0) {
					// pas de separateur dans cette ligne
					isGoodCandidate = false;
					break;
				}
				if (compte != previous && previous != 0) {
					// pas le meme nombre de separateur que la ligne precedente
					isGoodCandidate = false;
					break;
				}

				previous = compte;
				isGoodCandidate = true;
			}
			if (isGoodCandidate) {
				reste.add(separator);
			}
		}

		if (reste.isEmpty()) {
			// Exception ? aucun candidat
		}

		if (1 < reste.size()) {
			// Exception ? trop de candidats
		}

		return reste.get(0);

	}

	private void init() {
		lines = CsvFileHelper.readFile(file);

		cleanLines();

		if (autoDetectSeparatorMode) {
			this.separator = selectBestSeparator();
		}

		data = new ArrayList<String[]>(cleanedLines.size());
		String regex = new Character(separator).toString();
		boolean first = true;
		for (String line : cleanedLines) {

			String[] oneData = line.split(regex);

			if (first) {
				titles = oneData;
				first = false;
			} else {
				data.add(oneData);
			}
		}

		mapData();
	}

	// GETTERS

}
